package com.ly.lypopupwindowdemo.activity;

import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import com.ly.lypopupwindowdemo.R;
import com.ly.lypopupwindowdemo.util.SDCardHelper;

public class TextActivity extends AppCompatActivity implements View.OnClickListener {

    TextView tv;
    ScrollView scrollView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_text);

        init();


        int state = getIntent().getIntExtra("state", 0);

        tv.setMovementMethod(ScrollingMovementMethod.getInstance());

        if (state == 0) {
            tv.setVisibility(View.VISIBLE);
            scrollView.setVisibility(View.GONE);
            tv.setText("http://mp.weixin.qq.com/s/4WP1mTmeWTU8nFO9Ex9vQQ\n" +
                    "浅谈webview的页面跳转（一条地址请求在WebView中的跳转问题）\n" +
                    "\n" +
                    "\n" +
                    "WebView中有两个类用来管理网页\n" +
                    "WebChromeClient  WebViewClient\n" +
                    "\n" +
                    "setWebViewClient(new WebViewClient())\n" +
                    "设置了WebViewClient，在点击新链接的时候不会跳转到系统浏览器，而是在本地的webview中显示。\n" +
                    "主义并不需要覆盖shouldOverrideUrlLoading()\n" +
                    "\n" +
                    "--------------------------------------------------------------\n" +
                    "http://mp.weixin.qq.com/s/0vVe-vh_OFW1nbWIv6o_4g\n" +
                    "WebView的JavaScript与本地代码三种交互方式\n" +
                    "\n" +
                    "WebView漏洞分析：\n" +
                    "----\n" +
                    "这个漏洞主要是因为webView中的JS访问本地的方法存在缺陷。\n" +
                    "Android中和JS交互是通过WebView的一个方法。\n" +
                    "addJavascriptInterface(new Object(),\"myObj\");\n" +
                    "\n" +
                    "第一个参数是本地对象，第二个参数是JS代码中需要使用的对象，也就是说要android和后台协商好。\n" +
                    "这里就相当于一个映射，把Android中的本地对象和JS中的对象进行关联。\n" +
                    "\n" +
                    "那么这里就存在这样的一个问题了，在4.2系统之前，JS中通过对象调用的方法无需任何注解约束，那么就意味\n" +
                    "着JS中拿到这个对象，就可以调用这个对象中所有的方法。\n" +
                    "\n" +
                    "而我们知道Android中的对象有一个公共的方法 getClass() 方法，而这个方法可以获取到当前类 类型Class，\n" +
                    "而这个类型有一个很关键的方法就是 Class.forName，这个方法可以加载一个类，这里可以加载 java.lang.Runtime \n" +
                    "这个类，而这个类就可以执行本地命令了，那么就会发生危险了，比如这里可以执行命令获取本地设备的SD卡中的文\n" +
                    "件等信息，非常危险的。\n" +
                    "\n" +
                    "这个漏洞也是得力于JS中的语法特性，也可以看出JS语法非常灵活。\n" +
                    "\n" +
                    "------\n" +
                    "\n" +
                    "修复方法很简单，加上注解约束：@JavascriptInterface 。只有加上这个注解约束的方法才能被JS调用。\n" +
                    "\n" +
                    "\n" +
                    "--------------------------------------------------------------\n" +
                    "\n" +
                    "http://mp.weixin.qq.com/s/bf4f1V7qZhry5oasYVtvdg  nice nice\n" +
                    "\n" +
                    "一、WebView常用的方法\n" +
                    "----------------------\n" +
                    "1）loadUrl() \n" +
                    "\n" +
                    "//加载assets目录下的test.html文件\n" +
                    "webView.loadUrl(\"file:///android_asset/test.html\");\n" +
                    "//加载网络资源(注意要加上网络权限)\n" +
                    "webView.loadUrl(\"http://blog.csdn.net\");\n" +
                    "\n" +
                    "------------------------------------------------\n" +
                    "2)WebViewClient  辅助WebView处理通知，请求等事件。\n" +
                    "坊间有传言如果要网页只在webview内显示不跳转到浏览器内，需要setWebViewClient然后重写shouldOverrideUrlLoading\n" +
                    "方法。实际上只需要setWebViewClient(new WebViewClient())就可以了。\n" +
                    "\n" +
                    "以下是WebView常见的几种用法：\n" +
                    "\n" +
                    "\n" +
                    "\n" +
                    "（1） 实现对网页中超链接的拦截(比如如果是极客导航的主页，则直接拦截转到百度主页)： \n" +
                    "当点击页面中的链接后，会在WebView加载URL前回调shouldOverrideUrlLoading(WebView view, String url)方法，一般点击一个链接此方法调用一次。\n" +
                    "\n" +
                    "（2）加载网页时替换某个资源（比如在加载一个网页时，需要加载一个logo图片，而我们想要替换这个logo图片，用我们assets目录下的一张图片替代） \n" +
                    "\n" +
                    "（3）设置开始加载网页、加载完成、加载错误时处理\n" +
                    "\n" +
                    "（4）处理https请求，为WebView处理ssl证书设置WebView默认是不处理https请求的，需要在WebViewClient子类中重写\n" +
                    " 父类的onReceivedSslError函数\n" +
                    "\n" +
                    "-------------------------------------------------------\n" +
                    "\n" +
                    "\n" +
                    "3）setWebChromeClient \n" +
                    "WebChromeClient主要是用来辅助WebView处理JS的对话框，网站图标，网站标题以及网页加载进度等。\n" +
                    "\n" +
                    "以下是WebChromeClient常见的几个方法\n" +
                    "\n" +
                    "（1）显示页面加载进度  重写onProgressChanged函数\n" +
                    "\n" +
                    "（2）加快HTML网页加载完成速度（默认情况html代码下载到WebView后，webkit开始解析网页各个节点，\n" +
                    "发现有外部样式文件或者外部脚本文件时，会异步发起网络请求下载文件，但如果在这之前也有解析到\n" +
                    "image节点，那势必也会发起网络请求下载相应的图片。在网络情况较差的情况下，过多的网络请求就会\n" +
                    "造成带宽紧张，影响到css或js文件加载完成的时间，造成页面空白loading过久。解决的方法就是告诉\n" +
                    "WebView先不要自动加载图片，等页面finish后再发起图片加载。）\n" +
                    "\n" +
                    "\n" +
                    "----------------------------------------------------------\n" +
                    "\n" +
                    "4）setDownLoadListener\n" +
                    "\n" +
                    "-----------------------------------------------------------\n" +
                    "\n" +
                    "5) goBack()\n" +
                    "\n" +
                    "------------------------------------------------------\n" +
                    "\n" +
                    "二、WebSetting配置\n" +
                    "获取WebSettings对象\n" +
                    "\n" +
                    "WebSettings webSettings = webView.getSettings();\n" +
                    "常用设置方法\n" +
                    "\n" +
                    "（1）支持js\n" +
                    "\n" +
                    "settings.setJavaScriptEnabled(true);\n" +
                    "（2）设置缓存方式，主要有以下几种： \n" +
                    "LOAD_CACHE_ONLY: 不使用网络，只读取本地缓存数据。 \n" +
                    "LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。 \n" +
                    "LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式。 \n" +
                    "LOAD_NO_CACHE: 不使用缓存，只从网络获取数据。 \n" +
                    "LOAD_CACHE_ELSE_NETWORK：只要本地有，无论是否过期，或者no-cache，都使用缓存中的数据。\n" +
                    "\n" +
                    "settings.setCacheMode(WebSettings.LOAD_NO_CACHE);\n" +
                    "（3）开启DOM storage API功能（HTML5 提供的一种标准的接口，主要将键值对存储在本地，在页面加载完毕后可以通过 JavaScript 来操作这些数据。）\n" +
                    "\n" +
                    "settings.setDomStorageEnabled(true);\n" +
                    "（4）设置数据库缓存路径\n" +
                    "\n" +
                    "settings.setDatabasePath(cacheDirPath);\n" +
                    "（5）设置Application Caches缓存目录\n" +
                    "\n" +
                    "settings.setAppCachePath(cacheDirPath);\n" +
                    "（6）设置默认编码\n" +
                    "\n" +
                    "settings.setDefaultTextEncodingName(“utf-8”);\n" +
                    "（7）将图片调整到适合webview的大小\n" +
                    "\n" +
                    "settings.setUseWideViewPort(false);\n" +
                    "（8）支持缩放\n" +
                    "\n" +
                    "settings.setSupportZoom(true);\n" +
                    "（9）支持内容重新布局\n" +
                    "\n" +
                    "settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);\n" +
                    "（10）多窗口\n" +
                    "\n" +
                    "settings.supportMultipleWindows();\n" +
                    "（11）设置可以访问文件\n" +
                    "\n" +
                    "settings.setAllowFileAccess(true);\n" +
                    "（12）当webview调用requestFocus时为webview设置节点\n" +
                    "\n" +
                    "settings.setNeedInitialFocus(true);\n" +
                    "（13）设置支持缩放\n" +
                    "\n" +
                    "settings.setBuiltInZoomControls(true);\n" +
                    "（14）支持通过JS打开新窗口\n" +
                    "\n" +
                    "settings.setJavaScriptCanOpenWindowsAutomatically(true);\n" +
                    "（15）缩放至屏幕的大小\n" +
                    "\n" +
                    "settings.setLoadWithOverviewMode(true);\n" +
                    "（16）支持自动加载图片\n" +
                    "\n" +
                    "settings.setLoadsImagesAutomatically(true);\n" +
                    "\n" +
                    "\n" +
                    "===============================================================================\n" +
                    "Java调JS\n" +
                    "\n" +
                    "首先是JS的一段代码：\n" +
                    "function javaCallJs(arg){\n" +
                    "         document.getElementById(\"content\").innerHTML =\n" +
                    "             (\"欢迎：\"+arg );\n" +
                    "    }\n" +
                    "\n" +
                    "然后是在java中调用JS中的方法\n" +
                    "webView.loadUrl(\"javascript:javaCallJs(\"+\"'\"+name+\"'\"+\")\");\n" +
                    "\n" +
                    "以上代码就是调用了JS中一个叫javaCallJs(arg)的方法，并传入了一个name参数。（具体效果下面有展示）\n" +
                    "\n" +
                    "----------------------------------------------------------------------\n" +
                    "JS调java\n" +
                    "\n" +
                    "配置Javascript接口\n" +
                    "webView.addJavascriptInterface(new JSInterface (),\"Android\");\n" +
                    "\n" +
                    "实现Javascript接口类\n" +
                    "class JSInterface {\n" +
                    "    @JavascriptInterface\n" +
                    "     public void showToast(String arg){\n" +
                    "                   Toast.makeText(MainActivity.this,arg,Toast.LENGTH_SHORT).show();\n" +
                    "     }\n" +
                    "}\n" +
                    "\n" +
                    "JS中调用java代码\n" +
                    "<input type=\"button\" value=\"点击Android被调用\" onclick=\"window.Android.showToast('JS中传来的参数')\"/>\n" +
                    "\n" +
                    "window.Android.showToast(‘JS中传来的参数’)”中的”Android”即addJavascriptInterface（）中指定的，\n" +
                    "并且JS向java传递了参数，类型为String。而showToast(String arg)会以Toast的形式弹出此参数。\n" +
                    "\n" +
                    "------------------------------------------------------------------------------");
        }

        if (state == 1) {
            tv.setVisibility(View.VISIBLE);
            scrollView.setVisibility(View.GONE);
            tv.setText("windowSoftInputMode属性主要是说明activity界面的主窗口和屏幕内软键盘窗口如何交互的，设置这个属性会影响两件事：\n" +
                    "\n" +
                    "1.软键盘的状态-当activity获得焦点时，软键盘是隐藏状态还是可见状态\n" +
                    "\n" +
                    "2.对activity主窗口的调整-是否调整activity主窗口的大小来为软键盘预留空间，是否当activity主窗口的部分内容被软键盘遮盖时它的内容焦点是可见的\n" +
                    "\n" +
                    "设置的值必须是下列列表中的值的一个，或者是一个”state…”和一个”adjust…”的组合，但是在任一组中设置多个值-如在一组中设置了多个”state…”会得到未知结果，各个值之间用竖线（|）隔开，例如：\n" +
                    "\n" +
                    "    <activity android:windowSoftInputMode=\"stateVisible|adjustResize\" . . . >\n" +
                    "\n\"stateUnspecified\"：软键盘的状态(是否隐藏或可见)没有指定。该系统将选择一个合适的状态或  依靠theme中的设置，这个是默认设置。\n" +
                    "\n" +
                    "\"stateUnchanged\"：当activity来到栈顶时，软键盘可见或隐藏和前一个activity软键盘的状态保持一致并且不变。\n" +
                    "\n" +
                    "\"stateHidden\"：当用户选择到该activity时，软键盘是隐藏的-也就是说，当用户确实导航到该activity时，而不是因为离开另一个activity退回到该activity的时候。\n" +
                    "\n" +
                    "\"stateAlwaysHidden\"：软键盘总是隐藏的（即使activity有输入焦点）\n" +
                    "\n" +
                    "\"stateVisible\"：通常适当情况下软键盘是可见的（当用户导航到该activity的主窗口时）\n" +
                    "\n" +
                    "\"stateAlwaysVisible\"：当用户选择到该activity的时候软键盘是可见的-也就是说，用户确实是导航到该activity的时候，而不是因为离开另一个activity才返回到该activity的时候。\n" +
                    "\n" +
                    "这是默认设置软键盘的行为。\"adjustUnspecified\"：这个设置没有指明是否减小activity主窗口的大小来为软键盘预留空间，或者是否当activity主窗口的部分内容被软键盘遮盖时它的内容焦点是可见的。系统会选择其中的一种模式：根据窗口内容里是否有可以滑动内容的布局view，如果有这样的一个view，activity的窗口将会调整大小，假设滚动可以显示所有窗口的内容在一个更小的区域。\n" +
                    "\n" +
                    "\"adjustResize\"：activity的主窗口总是调整大小来为软键盘预留空间\n" +
                    "\n" +
                    "\"adjustPan\"：activity的主窗口并不会调整大小来为软键盘预留空间，相反，当前窗口的内容将会自动移动以便当前焦点从不被软键盘遮盖，用户能总是看到输入内容的部分。adjustPan相比于adjustResize通常用的少点，因为用户可能必须关闭软键盘才能和窗口中被遮挡的部分交互。");
        }

        if (state == 2) {
            //Android 内部存储外部存储
            tv.setVisibility(View.GONE);
            scrollView.setVisibility(View.VISIBLE);

        }
    }

    private void init() {

        tv = (TextView) findViewById(R.id.tv);
        scrollView = (ScrollView) findViewById(R.id.scrollview);
        findViewById(R.id.lianjie).setOnClickListener(this);
        findViewById(R.id.shiyong).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.lianjie:
                //博客链接
                MyWebViewActivity.startWebView(TextActivity.this, "Android内部存储和外部存储", "http://www.cnblogs.com/jingmo0319/p/5586559.html");
                break;
            case R.id.shiyong:
                initDialog();
                break;
        }
    }

    String[] sdhelperStr = new String[]{"判断SD卡是否被挂载", " 获取SD卡的根目录", "获取SD卡的完整空间大小，返回MB",
            "获取SD卡的剩余空间大小", " 获取SD卡的可用空间大小", "往SD卡的公有目录下保存文件", " 往SD卡的自定义目录下保存文件",
            "往SD卡的私有Files目录下保存文件", " 往SD卡的私有Cache目录下保存文件", "保存bitmap图片到SDCard的私有Cache目录",
            "从SD卡获取文件", " 从SDCard中寻找指定目录下的文件，返回Bitmap", "获取SD卡公有目录的路径"
            , "获取SD卡私有Cache目录的路径", " 获取SD卡私有Files目录的路径", "从sdcard中删除文件"
    };

    private void initDialog() {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("SDCardHelper的使用");
        builder.setItems(sdhelperStr, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case 0:
                        boolean ismounted = SDCardHelper.isSDCardMounted();
                        Toast.makeText(TextActivity.this, "是否挂载==" + ismounted, Toast.LENGTH_SHORT).show();
                        break;
                    case 1:
                        String str0 = SDCardHelper.getSDCardBaseDir();
                        Toast.makeText(TextActivity.this, "SDCard根目录==" + str0, Toast.LENGTH_LONG).show();
                        break;
                    case 2:
                        Toast.makeText(TextActivity.this, "sd卡完整空间大小(MB)=="+SDCardHelper.getSDCardSize(), Toast.LENGTH_SHORT).show();
                        break;
                    case 3:
                        Toast.makeText(TextActivity.this, "SD卡剩余空间大小=="+SDCardHelper.getSDCardFreeSize(), Toast.LENGTH_SHORT).show();
                        break;
                    case 4:
                        Toast.makeText(TextActivity.this, "获取SD卡可用空间大小==="+SDCardHelper.getSDCardAvailableSize(), Toast.LENGTH_SHORT).show();
                        break;
                    case 5:
                        //往SD卡的公有目录下保存文件

//                        byte[] b= new byte[1024];
//                        SDCardHelper.saveFileToSDCardPublicDir(b,)

                        break;
                    case 6:
                        break;
                    case 7:
                        break;
                    case 8:
                        break;
                    case 9:
                        break;
                    case 10:
                        break;
                    case 11:
                        break;
                    case 12:
                        break;
                    case 13:
                        break;
                    case 14:
                        break;
                    case 15:
                        break;

                }
            }
        });
        builder.show();
    }
}
